<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/ir-black.min.css" crossorigin>
<style>
:root {
--highlight-color: #202;
}
html {
scrollbar-face-color: #646464;
scrollbar-base-color: #646464;
scrollbar-3dlight-color: #646464;
scrollbar-highlight-color: #646464;
scrollbar-track-color: #000;
scrollbar-arrow-color: #000;
scrollbar-shadow-color: #646464;
scrollbar-dark-shadow-color: #646464;
}
::-webkit-scrollbar { width: 14px; height: 3px;}
::-webkit-scrollbar-button {
background-color: #000;
height: 3px;}
::-webkit-scrollbar-track {
background-color: #646464;}
::-webkit-scrollbar-track-piece { background-color: #000;}
::-webkit-scrollbar-thumb { height: 50px; background-color: #666; border-radius: 7px;}
::-webkit-scrollbar-corner { background-color: #646464;}
::-webkit-resizer { background-color: #666;}
.flex {
display: flex !important;
}
body {
line-height: 1.5em;
color: #fff;
background-color: #1e1e1e;
font: 14px/1.5 Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
}
#content {
padding: 20px;
}
#sidebar {
padding: 30px;
overflow: hidden;
}
#sidebar>*:last-child {
margin-bottom: 2cm;
}
.http-server-breadcrumbs {
font-size: 130%;
margin: 0 0 15px 0;
}
#footer {
font-size: .75em;
padding: 5px 30px;
border-top: 1px solid #fff;
text-align: right;
}
#footer p {
margin: 0 0 0 1em;
display: inline-block;
}
#footer p:last-child {
margin-right: 30px;
}
h1,
h2,
h3,
h4,
h5 {
font-weight: 300;
color: #fff;
}
h1 {
font-size: 2.5em;
line-height: 1.1em;
}
h2 {
font-size: 1.75em;
margin: 1em 0 .50em 0;
}
h3 {
font-size: 1.4em;
margin: 25px 0 10px 0;
}
h4 {
margin: 0;
font-size: 105%;
}
h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
background: #1e1e1e;
padding: 0.2em 0;
}
a {
color: #8fd6fc;
text-decoration: none;
transition: color .3s ease-in-out;
}
a:hover {
color: #00a4fc;
}
.title code {
font-weight: bold;
}
h2[id^="header-"] {
margin-top: 2em;
}
.ident {
color: #f6fc85;
}
strong {
color: #8fd6fc;
}
pre code {
background: transparent;
font-size: .8em;
line-height: 1.4em;
}
code {
background: rgba(255, 255, 255, 0.1);
padding: 1px 4px;
overflow-wrap: break-word;
}
h1 code {
background: transparent
}
pre {
background: transparent;
border: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
margin: 1em 0;
padding: 1ex;
}
#http-server-module-list {
display: flex;
flex-flow: column;
}
#http-server-module-list div {
display: flex;
}
#http-server-module-list dt {
min-width: 10%;
}
#http-server-module-list p {
margin-top: 0;
}
.toc ul,
#index {
list-style-type: none;
margin: 0;
padding: 0;
}
#index code {
background: transparent;
}
#index h3 {
border-bottom: 1px solid #ddd;
}
#index ul {
padding: 0;
}
#index h4 {
margin-top: .6em;
font-weight: bold;
}
/* Make TOC lists have 2+ columns when viewport is wide enough.
Assuming ~20-character identifiers and ~30% wide sidebar. */
@media (min-width: 200ex) {
#index .two-column {
column-count: 2
}
}
@media (min-width: 300ex) {
#index .two-column {
column-count: 3
}
}
dl {
margin-bottom: 2em;
}
dl dl:last-child {
margin-bottom: 4em;
}
dd {
margin: 0 0 1em 3em;
}
#header-classes+dl>dd {
margin-bottom: 3em;
}
dd dd {
margin-left: 2em;
}
dd p {
margin: 10px 0;
}
.name {
background: #000;
font-weight: bold;
font-size: .85em;
padding: 5px 10px;
display: inline-block;
min-width: 40%;
}
.name:hover {
background: #0b0b0b;
}
dt:target .name {
background: var(--highlight-color);
}
.name>span:first-child {
white-space: nowrap;
}
.name.class>span:nth-child(2) {
margin-left: .4em;
}
.inherited {
color: #999;
border-left: 5px solid #eee;
padding-left: 1em;
}
.inheritance em {
font-style: normal;
font-weight: bold;
}
.pydefname {
color: #f90;
}
/* Docstrings titles, e.g. in numpydoc format */
.desc h2 {
font-weight: 400;
font-size: 1.25em;
}
.desc h3 {
font-size: 1em;
}
.desc dt code {
background: inherit;
/* Don't grey-back parameters */
}
.source summary,
.git-link-div {
color: #666;
text-align: right;
font-weight: 400;
font-size: .8em;
text-transform: uppercase;
}
.source summary>* {
white-space: nowrap;
cursor: pointer;
}
.git-link {
color: inherit;
margin-left: 1em;
}
.source pre {
max-height: 500px;
overflow: auto;
margin: 0;
}
.source pre code {
font-size: 12px;
overflow: visible;
}
.hlist {
list-style: none;
}
.hlist li {
display: inline;
}
.hlist li:after {
content: ',\2002';
}
.hlist li:last-child:after {
content: none;
}
.hlist .hlist {
display: inline;
padding-left: 1em;
}
img {
max-width: 100%;
}
td {
padding: 0 .5em;
}
.admonition {
padding: .1em .5em;
margin-bottom: 1em;
}
.admonition-title {
font-weight: bold;
}
.admonition.note,
.admonition.info,
.admonition.important {
background: #00a;
}
.admonition.todo,
.admonition.versionadded,
.admonition.tip,
.admonition.hint {
background: #050;
}
.admonition.warning,
.admonition.versionchanged,
.admonition.deprecated {
background: #ec0;
}
.admonition.error,
.admonition.danger,
.admonition.caution {
background: #c20010;
}
p {
color: #fff;
}
</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from plugins.LSTRLaneDetection.LSTRLaneDetection.lstr.lstr import LSTR
import os
from enum import Enum
import numpy as np
from plugins.plugin import PluginInformation
from src.logger import print

PluginInfo = PluginInformation(
    name=&#34;LSTRLaneDetection&#34;, # This needs to match the folder name under plugins (this would mean plugins\Plugin\main.py)
    description=&#34;The recommended lane detection type.\nWill use the CPU to detect lanes on the image.\nMad props to the LSTR team\nfor making something this lightweight and fast!&#34;,
    version=&#34;0.1&#34;,
    author=&#34;Tumppi066&#34;,
    url=&#34;https://github.com/Tumppi066/Euro-Truck-Simulator-2-Lane-Assist&#34;,
    type=&#34;dynamic&#34;, # = Panel
    dynamicOrder=&#34;lane detection&#34;, # Will run the plugin before anything else in the mainloop (data will be empty)
    exclusive=&#34;LaneDetection&#34; # Will disable the other screen capture plugins
)

import tkinter as tk
from tkinter import ttk
import src.helpers as helpers
import src.mainUI as mainUI
import src.variables as variables
import src.settings as settings
import os
import cv2
import numpy as np


model = None
useGPU = True

# LSTR model types
class ModelType(Enum):
    LSTR_180X320 = &#34;lstr_180x320&#34;
    LSTR_240X320 = &#34;lstr_240x320&#34;
    LSTR_360X640 = &#34;lstr_360x640&#34;
    LSTR_480X640 = &#34;lstr_480x640&#34;
    LSTR_720X1280 = &#34;lstr_720x1280&#34;

def discover_models():
    # Find all models in the models folder
    models = []
    dir = variables.PATH + &#34;/plugins/LSTRLaneDetection/models&#34;
    for file in os.listdir(dir):
        if file.endswith(&#34;.onnx&#34;):
            models.append(file)

    return models

def load_model(model_name):
    global useGPU
    try:
        global model
        # Discover model type
        model_type = None
        for type in ModelType:
            if type.value in model_name:
                model_type = type
                break
        
        # Load model
        dir = variables.PATH + &#34;/plugins/LSTRLaneDetection&#34;
        print(&#34;There might be two error messages following this note, ignore them if you are not trying to get GPU acceleration to work.&#34;)
        print(&#34;Use the following link to set it up https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements&#34;)
        model = LSTR(model_type, dir + &#34;/models/&#34; + model_name, use_gpu=useGPU)
        return True
    except Exception as e:
        print(&#34;Error loading model: &#34; + str(e))
        useGPU = False
        return False
    
def detect_lanes(image, draw_points=False, draw_poly=False, color=(255,191,0)):
    global model
    global lanes_points
    global lane_ids
    if model is not None:
        # Detect lanes
        detected_lanes, lane_ids = model.detect_lanes(image)
        # output_img = model.draw_lanes(image, color=color, fillPoly=draw_poly)
        lanes_points = detected_lanes
        lane_ids = lane_ids
        
        # Calculate difference
        rightLane = np.where(lane_ids==0)[0]
        leftLane = np.where(lane_ids==5)[0]
        #print(lane_ids)
        #print(leftLane)
        #print(rightLane)
        try:
            # Get the left and right lane position
            leftx = lanes_points[leftLane[0]][0][0]
            rightx = lanes_points[rightLane[0]][0][0]
            # Calculate difference
            difference = (leftx + rightx) / 2
            
        except:
            difference = int(modelName.split(&#34;_&#34;)[1].split(&#34;x&#34;)[1].split(&#34;.&#34;)[0]) / 2 
            pass

        return lanes_points, lane_ids, difference
    
def onEnable():
    pass

def onDisable():
    pass

# The main file runs the &#34;plugin&#34; function each time the plugin is called
# The data variable contains the data from the mainloop, plugins can freely add and modify data as needed
# The data from the last frame is contained under data[&#34;last&#34;]
def plugin(data):
    global modelName
    try: # Try and find the frame
        frame = data[&#34;frame&#34;]
        # If we do then run the lane detection
        if model == None:
            modelName = settings.GetSettings(&#34;LSTR&#34;, &#34;Model&#34;)
            if modelName == None:
                modelName = discover_models()[0]
            print(&#34;Model successful: &#34; + str(load_model(modelName)))
            
        if model is not None:
            points, ids, difference = detect_lanes(frame)
            
            data[&#34;LSTR&#34;] = {}
            data[&#34;LSTR&#34;][&#34;points&#34;] = points
            data[&#34;LSTR&#34;][&#34;ids&#34;] = ids
            
            frame = data[&#34;frame&#34;]
            # Add a point for the middle of the lane
            try:
                cv2.circle(frame, (int(difference), int(frame.shape[0]- 10)), 5, (0,0,255), -1, cv2.LINE_AA)
                data[&#34;frame&#34;] = frame
            except Exception as ex:
                print(ex)
                pass
            
            w = int(modelName.split(&#34;_&#34;)[1].split(&#34;x&#34;)[1].split(&#34;.&#34;)[0])
            difference = difference - (w / 2)
            difference = difference / w - 0.5 # Scale it between -1 and 1
            data[&#34;LaneDetection&#34;] = {}
            data[&#34;LaneDetection&#34;][&#34;difference&#34;] = difference
            #print(difference)
            
        return data
            
    except Exception as ex:
        print(ex)
        return data


# Plugins can also have UIs, this works the same as the panel example
class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            models = discover_models()
            # Make a dropdown menu for selecting the model
            self.model = tk.StringVar(self.root)
            
            self.model.set(models[0]) # default value
                
            self.modelMenu = ttk.OptionMenu(self.root, self.model, *models, command=lambda: settings.CreateSettings(&#34;LSTRLaneDetection&#34;, &#34;Model&#34;, self.model.get()))
            self.modelMenu.config(width=20)
            self.modelMenu.grid(row=0, column=0, padx=10, pady=10)
            
            helpers.MakeButton(self.root, &#34;Load model&#34;, lambda: load_model(self.model.get()), 0, 1)
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
    
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.detect_lanes"><code class="name flex">
<span>def <span class="ident">detect_lanes</span></span>(<span>image, draw_points=False, draw_poly=False, color=(255, 191, 0))</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def detect_lanes(image, draw_points=False, draw_poly=False, color=(255,191,0)):
    global model
    global lanes_points
    global lane_ids
    if model is not None:
        # Detect lanes
        detected_lanes, lane_ids = model.detect_lanes(image)
        # output_img = model.draw_lanes(image, color=color, fillPoly=draw_poly)
        lanes_points = detected_lanes
        lane_ids = lane_ids
        
        # Calculate difference
        rightLane = np.where(lane_ids==0)[0]
        leftLane = np.where(lane_ids==5)[0]
        #print(lane_ids)
        #print(leftLane)
        #print(rightLane)
        try:
            # Get the left and right lane position
            leftx = lanes_points[leftLane[0]][0][0]
            rightx = lanes_points[rightLane[0]][0][0]
            # Calculate difference
            difference = (leftx + rightx) / 2
            
        except:
            difference = int(modelName.split(&#34;_&#34;)[1].split(&#34;x&#34;)[1].split(&#34;.&#34;)[0]) / 2 
            pass

        return lanes_points, lane_ids, difference</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.discover_models"><code class="name flex">
<span>def <span class="ident">discover_models</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def discover_models():
    # Find all models in the models folder
    models = []
    dir = variables.PATH + &#34;/plugins/LSTRLaneDetection/models&#34;
    for file in os.listdir(dir):
        if file.endswith(&#34;.onnx&#34;):
            models.append(file)

    return models</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.load_model"><code class="name flex">
<span>def <span class="ident">load_model</span></span>(<span>model_name)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def load_model(model_name):
    global useGPU
    try:
        global model
        # Discover model type
        model_type = None
        for type in ModelType:
            if type.value in model_name:
                model_type = type
                break
        
        # Load model
        dir = variables.PATH + &#34;/plugins/LSTRLaneDetection&#34;
        print(&#34;There might be two error messages following this note, ignore them if you are not trying to get GPU acceleration to work.&#34;)
        print(&#34;Use the following link to set it up https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements&#34;)
        model = LSTR(model_type, dir + &#34;/models/&#34; + model_name, use_gpu=useGPU)
        return True
    except Exception as e:
        print(&#34;Error loading model: &#34; + str(e))
        useGPU = False
        return False</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onDisable"><code class="name flex">
<span>def <span class="ident">onDisable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onDisable():
    pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onEnable"><code class="name flex">
<span>def <span class="ident">onEnable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def onEnable():
    pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.plugin"><code class="name flex">
<span>def <span class="ident">plugin</span></span>(<span>data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def plugin(data):
    global modelName
    try: # Try and find the frame
        frame = data[&#34;frame&#34;]
        # If we do then run the lane detection
        if model == None:
            modelName = settings.GetSettings(&#34;LSTR&#34;, &#34;Model&#34;)
            if modelName == None:
                modelName = discover_models()[0]
            print(&#34;Model successful: &#34; + str(load_model(modelName)))
            
        if model is not None:
            points, ids, difference = detect_lanes(frame)
            
            data[&#34;LSTR&#34;] = {}
            data[&#34;LSTR&#34;][&#34;points&#34;] = points
            data[&#34;LSTR&#34;][&#34;ids&#34;] = ids
            
            frame = data[&#34;frame&#34;]
            # Add a point for the middle of the lane
            try:
                cv2.circle(frame, (int(difference), int(frame.shape[0]- 10)), 5, (0,0,255), -1, cv2.LINE_AA)
                data[&#34;frame&#34;] = frame
            except Exception as ex:
                print(ex)
                pass
            
            w = int(modelName.split(&#34;_&#34;)[1].split(&#34;x&#34;)[1].split(&#34;.&#34;)[0])
            difference = difference - (w / 2)
            difference = difference / w - 0.5 # Scale it between -1 and 1
            data[&#34;LaneDetection&#34;] = {}
            data[&#34;LaneDetection&#34;][&#34;difference&#34;] = difference
            #print(difference)
            
        return data
            
    except Exception as ex:
        print(ex)
        return data</code></pre>
</details>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType"><code class="flex name class">
<span>class <span class="ident">ModelType</span></span>
<span>(</span><span>*args, **kwds)</span>
</code></dt>
<dd>
<div class="desc"><p>Create a collection of name/value pairs.</p>
<p>Example enumeration:</p>
<pre><code class="language-python-repl">&gt;&gt;&gt; class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3
</code></pre>
<p>Access them by:</p>
<ul>
<li>attribute access::</li>
</ul>
<pre><code class="language-python-repl">&gt;&gt;&gt; Color.RED
&lt;Color.RED: 1&gt;
</code></pre>
<ul>
<li>value lookup:</li>
</ul>
<pre><code class="language-python-repl">&gt;&gt;&gt; Color(1)
&lt;Color.RED: 1&gt;
</code></pre>
<ul>
<li>name lookup:</li>
</ul>
<pre><code class="language-python-repl">&gt;&gt;&gt; Color['RED']
&lt;Color.RED: 1&gt;
</code></pre>
<p>Enumerations can be iterated over, and know how many members they have:</p>
<pre><code class="language-python-repl">&gt;&gt;&gt; len(Color)
3
</code></pre>
<pre><code class="language-python-repl">&gt;&gt;&gt; list(Color)
[&lt;Color.RED: 1&gt;, &lt;Color.BLUE: 2&gt;, &lt;Color.GREEN: 3&gt;]
</code></pre>
<p>Methods can be added to enumerations, and members can have their own
attributes &ndash; see the documentation for details.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class ModelType(Enum):
    LSTR_180X320 = &#34;lstr_180x320&#34;
    LSTR_240X320 = &#34;lstr_240x320&#34;
    LSTR_360X640 = &#34;lstr_360x640&#34;
    LSTR_480X640 = &#34;lstr_480x640&#34;
    LSTR_720X1280 = &#34;lstr_720x1280&#34;</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li>enum.Enum</li>
</ul>
<h3>Class variables</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_180X320"><code class="name">var <span class="ident">LSTR_180X320</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_240X320"><code class="name">var <span class="ident">LSTR_240X320</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_360X640"><code class="name">var <span class="ident">LSTR_360X640</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_480X640"><code class="name">var <span class="ident">LSTR_480X640</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_720X1280"><code class="name">var <span class="ident">LSTR_720X1280</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI"><code class="flex name class">
<span>class <span class="ident">UI</span></span>
<span>(</span><span>master)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.exampleFunction()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        
        def exampleFunction(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=600, height=520)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            models = discover_models()
            # Make a dropdown menu for selecting the model
            self.model = tk.StringVar(self.root)
            
            self.model.set(models[0]) # default value
                
            self.modelMenu = ttk.OptionMenu(self.root, self.model, *models, command=lambda: settings.CreateSettings(&#34;LSTRLaneDetection&#34;, &#34;Model&#34;, self.model.get()))
            self.modelMenu.config(width=20)
            self.modelMenu.grid(row=0, column=0, padx=10, pady=10)
            
            helpers.MakeButton(self.root, &#34;Load model&#34;, lambda: load_model(self.model.get()), 0, 1)
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        
        def update(self, data): # When the panel is open this function is called each frame 
            self.root.update()
    
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.destroy"><code class="name flex">
<span>def <span class="ident">destroy</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def destroy(self):
    self.done = True
    self.root.destroy()
    del self</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.exampleFunction"><code class="name flex">
<span>def <span class="ident">exampleFunction</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def exampleFunction(self):
    
    try:
        self.root.destroy() # Load the UI each time this plugin is called
    except: pass
    
    self.root = tk.Canvas(self.master, width=600, height=520)
    self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
    self.root.pack_propagate(0)
    
    models = discover_models()
    # Make a dropdown menu for selecting the model
    self.model = tk.StringVar(self.root)
    
    self.model.set(models[0]) # default value
        
    self.modelMenu = ttk.OptionMenu(self.root, self.model, *models, command=lambda: settings.CreateSettings(&#34;LSTRLaneDetection&#34;, &#34;Model&#34;, self.model.get()))
    self.modelMenu.config(width=20)
    self.modelMenu.grid(row=0, column=0, padx=10, pady=10)
    
    helpers.MakeButton(self.root, &#34;Load model&#34;, lambda: load_model(self.model.get()), 0, 1)
    
    self.root.pack(anchor=&#34;center&#34;, expand=False)
    self.root.update()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.update"><code class="name flex">
<span>def <span class="ident">update</span></span>(<span>self, data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def update(self, data): # When the panel is open this function is called each frame 
    self.root.update()</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection" href="index.html">Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="two-column">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.detect_lanes" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.detect_lanes">detect_lanes</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.discover_models" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.discover_models">discover_models</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.load_model" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.load_model">load_model</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onDisable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onDisable">onDisable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onEnable" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.onEnable">onEnable</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.plugin" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.plugin">plugin</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType">ModelType</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_180X320" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_180X320">LSTR_180X320</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_240X320" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_240X320">LSTR_240X320</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_360X640" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_360X640">LSTR_360X640</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_480X640" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_480X640">LSTR_480X640</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_720X1280" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.ModelType.LSTR_720X1280">LSTR_720X1280</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI">UI</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.destroy" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.destroy">destroy</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.exampleFunction" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.exampleFunction">exampleFunction</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.update" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.LSTRLaneDetection.main.UI.update">update</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>